package com.sky.job;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.hxc.pay.CommonPayTemplate;
import com.hxc.pay.wx.service.PaySuccessService;
import com.sky.constant.PayStatusConstant;
import com.sky.mapper.common.OrdersMapper;
import com.sky.pojo.Orders;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 订单支付终态保障任务
 *
 * @author zgp
 * @version V1.0
 * @date 2025-02-06 10:39
 */
@Slf4j
@Component
public class OrderSchedulJob {
    @Autowired
    private OrdersMapper ordersMapper;
    @Autowired
    private CommonPayTemplate commonPayTemplate;
    @Autowired
    private PaySuccessService paySuccessService;

    /**
     * 定时任务：
     * 订单超时未支付取消、订支付通知失败兜底处理
     */
    // @Scheduled(cron = "0/5 * * * * ?")
    public void orderPayTimeoutCancelAndPaySuccessModifyStatusJob() {
        log.info("定时任务处理超时未支付订单");
        // 查询15分钟前未支付订单
        LocalDateTime time = LocalDateTime.now().minusSeconds(15 * 60);
        List<Orders> ordersList = ordersMapper.selectByPayStatusAndOrderTime(PayStatusConstant.UNPAID, time);

        if (ObjectUtil.isNotEmpty(ordersList)) {
            ordersList.forEach(o -> {
                // 调用微信查询订单，确保订单是未支付状态
                String number = o.getNumber();
                String resultJson = commonPayTemplate.queryOrder(number);
                Map<String, Object> parseObject = JSON.parseObject(resultJson, Map.class);
                Object tradeState = parseObject.get("trade_state");
                if ("NOTPAY".equals(tradeState)) {
                    log.info("定时任务：处理超时未支付订单, {}", o);
                    // 调用微信关闭订单接口，关闭订单
                    commonPayTemplate.close(number);
                    // 修改数据库订单状态为取消状态
                    Orders orders = Orders.builder()
                            .number(o.getNumber())
                            .status(Orders.CANCELLED_ORDER)
                            .cancelTime(LocalDateTime.now())
                            .cancelReason("订单超时未支付")
                            .build();
                    ordersMapper.updateByNumber(orders);
                }
                if ("SUCCESS".equals(tradeState)) {
                    log.info("定时任务：订单支付成功兜底处理, {}", o);
                    // 支付成功，主动调用支付成功回调方法
                    paySuccessService.success(o.getNumber());
                }
            });
        }
    }

    // /**
    //  * 退款成功兜底处理，保证订单支付状态一致性
    //  */
    // @Scheduled(cron = "* 0/1 * * * ?")
    // public void orderRefundConsistencyProtectJob() {
    //     // 查询订单状态=已取消，并且支付状态=已支付订单
    //     OrdersPageQueryDTO queryDTO = OrdersPageQueryDTO.builder()
    //             .status(Orders.CANCELLED_ORDER)
    //             .payStatus(PayStatusConstant.PAID)
    //             .build();
    //     List<OrderVO> orderVOS = ordersMapper.selectPageByConditions(queryDTO);
    //     if (ObjectUtil.isNotEmpty(orderVOS)) {
    //         // 主动查询微信订单
    //         // 商户侧暂未保存退款单号，因此无法主动查询退款单状态.
    //
    //         // 判断是否退款成功
    //
    //         // 更改支付状态
    //
    //     }
    // }
}
